package model

import (
	"errors"
	"strconv"
	"sync"
)

type Meeting struct {
	// 会议号，能唯一标识会议
	Id int `json:"meetingId"`

	// 支持会议的服务器的地址
	Addr Address `json:"addr"`

	// 用户列表，映射的键为用户的 id
	userList map[int]*User

	// 会议人数限制
	limit int

	mutex *sync.RWMutex
}

// NewMeeting 创建新的会议
func NewMeeting(id int, addr Address, limit int) *Meeting {
	return &Meeting{
		Id:       id,
		Addr:     addr,
		userList: make(map[int]*User),
		limit:    limit,
		mutex:    new(sync.RWMutex),
	}
}

// AddUser 添加用户
func (m *Meeting) AddUser(user *User) error {
	m.mutex.Lock()
	defer m.mutex.Unlock()

	// 判断会议是能能容纳更多的用户
	if len(m.userList) >= m.limit {
		return errors.New("the meeting can not accommodate more users")
	}

	// 将新用户添加到用户列表中
	m.userList[user.id] = user
	return nil
}

// RemoveUserById 移除用户
func (m *Meeting) RemoveUserById(userId int) (*User, error) {
	m.mutex.Lock()
	defer m.mutex.Unlock()

	// 判断用户是否在会议中
	if m.userList[userId] == nil {
		return nil, errors.New("the user with id " + strconv.Itoa(userId) + " is not in the meeting")
	}

	// 将该用户从用户列表移除
	user := m.userList[userId]
	delete(m.userList, userId)

	return user, nil
}

// GetLimit 获取人数上限
func (m *Meeting) GetLimit() int {
	return m.limit
}
